home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 7 / FM Towns Free Software Collection 7.iso / taropyon / cci / find2.cci < prev    next >
Text File  |  1993-11-30  |  7KB  |  309 lines

  1. /*************************************************************************
  2. *    "find2.cci" : パターン検索
  3. *************************************************************************/
  4.  
  5. #include    "ccilib.h"
  6.  
  7. /*    パレットデータ(HEwin 配色)    */
  8. char    PltDat[3][16] =
  9. {
  10.     /* G R  B                                */
  11.     { 0, 0, 0},    /* C_BALCK, C_THROUGH        */
  12.     { 0, 0, 0},    /* C_BLUE , C_MBLACK         */
  13.     { 7, 7, 8},    /* C_RED                    */
  14.     {12,12,13},    /* C_MAGENTA                */
  15.     { 6, 5, 7},    /* C_GREEN                    */
  16.     { 8, 7, 9},    /* C_CYAN                    */
  17.     {10, 9,11},    /* C_YELLOW                    */
  18.     {11,11,12},    /* C_WHITE                    */
  19.  
  20.     { 5, 5, 6},    /* C_HBALCK                    */
  21.     { 0, 0,11},    /* C_HBLUE                    */
  22.     { 0,11, 0},    /* C_HRED                    */
  23.     { 0,11,11},    /* C_HMAGENTA                */
  24.     {11, 0, 0},    /* C_HGEEN                    */
  25.     {11, 0,11},    /* C_HCYAN                    */
  26.     {11,11, 0},    /* C_HYELLOW                */
  27.     {14,14,15}    /* C_HWHITE                    */
  28. };
  29.  
  30. /*************************************************************************
  31. *    初期化
  32. *************************************************************************/
  33.  
  34. int        init()
  35. {
  36.     DSP_sysInit(0);            /* 表示システム初期化        */
  37.     KBF_sysInit();            /* キーボードシステム初期化    */
  38.     KBF_kan_off();
  39.     FDL_sysInit();            /* ファイルダイアログ初期化    */
  40.  
  41.     sdk_control(0);            /* サイドワーク起動禁止        */
  42.  
  43.     DSP_writePage(0);        /* 書き込みページ            */
  44.     DSP_setPlt( PltDat );    /* パレット設定                */
  45.     DSP_boxf(0,24,639,463,PSET,COLMIX(5,6));
  46.  
  47.     DSP_writePage(1);        /* 書き込みページ            */
  48.     DSP_setPlt( PltDat );    /* パレット設定                */
  49.     DSP_title("FIND2","0.99",15,7,0,0);
  50.     evt_setDspTime( 1, 432, 4, 7, 0 );    /* 時刻表示アイドリング処理設定    */
  51.     SYL_clear();
  52. }
  53.  
  54. /*************************************************************************
  55. *    終了
  56. *************************************************************************/
  57.  
  58. int        term()
  59. {
  60.     FDL_sysEnd();
  61.     KBF_sysEnd();
  62.     DSP_sysEnd();
  63. }
  64.  
  65. int            Upcase = 0;
  66. char        Ptn[BUFSIZ] = {'\0'};
  67. char        *RePtn = NULL;
  68.  
  69. char        *TxtPtr = NULL;
  70.  
  71. #define        TABSIZE    (8)
  72. #define        TXT_XS    (80)
  73. #define        TXT_YS    (20)
  74.  
  75.  
  76. /*************************************************************************
  77. *    大文字,小文字を区別するモードの切り換え
  78. *************************************************************************/
  79.  
  80. int        upcase_func( int evtNo, char *sbj )
  81. {
  82.     Upcase = Upcase ?  0 : 1;
  83.  
  84.     /* 検索パターンの再コンパイル */
  85.     if ( RePtn )
  86.         RePtnFree(RePtn);
  87.     RePtn = RePtnAlloc(Ptn,Upcase);
  88.  
  89.     return (evtNo);
  90. }
  91.  
  92. /*************************************************************************
  93. *    検索パターンの入力
  94. *************************************************************************/
  95.  
  96. int        pattern_func( int evtNo, char *sbj )
  97. {
  98.     int        ret, x, y;
  99.     char    *dlg;
  100.  
  101.     x = y = DLGPOS_MOS_SET_HOME;
  102.     dlg = DLG_getsOpen( x, y, 320, "検索パターンを入力してください。");
  103.     if ( dlg == NULL )
  104.         return (evtNo);    /* error */
  105.     DLG_getsSetTitle( dlg, "INPUT PATTERN" );
  106.     ret = DLG_getsStart( dlg, BUFSIZ-1, Ptn );
  107.     if ( ret > 0 )
  108.     {    /* 入力あり */
  109.         if ( RePtn )
  110.             RePtnFree(RePtn);
  111.         if ( (RePtn = RePtnAlloc(Ptn,Upcase)) == NULL )
  112.         {
  113.             DLG_tmpMsgBox( x, y, C_MBLACK, C_DLGBASE, COLMIX(C_ERROR,C_GRAY),
  114.                 "    Pattern error!!   " );
  115.         }
  116.     }
  117.     DLG_getsClose(dlg);
  118.  
  119.     return (evtNo);
  120. }
  121.  
  122. int        find( char *dlg, char *fn )
  123. {
  124.     char    *fp;
  125.     char    buf[BUFSIZ];
  126.     int        count;
  127.     long    ln;                /* 行番号    */
  128.  
  129.     DLG_msgPrintf(dlg,"\r\n- %s -\r\n", fn );
  130.     TxtPtr = DLG_txtSetLinBuf( TxtPtr, TABSIZE, TXT_XS, "- %s -", fn );
  131.  
  132.     if ( (fp = fopen(fn,"r")) == NULL )
  133.     {
  134.         DLG_msgPrintf(dlg,"File open error!! (%s)\r\n", fn );
  135.         return (ERR);
  136.     }
  137.  
  138.     count = 0;
  139.     ln = 0;
  140.     while ( fgets(buf,BUFSIZ,fp) != NULL )
  141.     {
  142.         ++ln;
  143.         if ( RePtnMatch( RePtn, buf ) >= 0 )
  144.         {    /* マッチング */
  145.             ++count;
  146.             DLG_msgPrintf(dlg,"%6d : %s\r", ln, buf );
  147.             TxtPtr = DLG_txtSetLinBuf( TxtPtr, TABSIZE, TXT_XS, "%s", buf );
  148.         }
  149.     }
  150.  
  151.     fclose(fp);
  152.     return (count);
  153. }
  154.  
  155. /*************************************************************************
  156. *    検索開始
  157. *************************************************************************/
  158.  
  159. int        find_func( int evtNo, char *sbj )
  160. {
  161.     int        i, x, y, ret;
  162.     int        mdFdl;
  163.     char    *fdl;
  164.     char    *fn;
  165.     char    *dlg;
  166.  
  167.     if ( RePtn == NULL )
  168.     {
  169.         x = y = DLGPOS_CENTER_OF_SCN;
  170.         MNU_sure( x, y, C_MBLACK, C_DLGBASE, COLMIX(C_ERROR,C_GRAY),
  171.             SELBTN_ATT_CENTER, "    検索パターンが指定されていません。  " );
  172.         return (ERR);
  173.     }
  174.  
  175.     mdFdl = FDL_MODE_MULTI | FDL_MODE_BIT_DIRIGN | FDL_MODE_BIT_SIDEWORK;
  176.     if ( (fdl = FDL_open(mdFdl)) == NULL )
  177.         return (ERR);
  178.     FDL_set_title( fdl, "FIND");
  179.     FDL_set_wildcard( fdl, "*.*");
  180.     SYL_puts(C_HGREEN,"検索するファイルを指定してください。");
  181.     ret = FDL_start(fdl);
  182.     SYL_clear();
  183.     if ( ret != NORMAL )
  184.     {
  185.         FDL_close(fdl);
  186.         return (evtNo);
  187.     }
  188.  
  189.     i = 0;
  190.     while ( FDL_getMarkFile(fdl, i) != NULL )
  191.         ++i;
  192.     if ( i == 0 )
  193.     {    /* ファイルが指定されていない */
  194.         FDL_close(fdl);
  195.         return (evtNo);
  196.     }
  197.  
  198.     x = y = DLGPOS_CENTER_OF_SCN;
  199.     ret = MNU_sure( x, y, C_MBLACK, C_DLGBASE, COLMIX(C_INFO,C_GRAY),
  200.         SELBTN_ATT_CENTER,
  201.         "    %d 個のファイルが指定されています。  \n    検索を実行します。  ",
  202.         i );
  203.     if ( ret < 0 )
  204.     {
  205.         FDL_close(fdl);
  206.         return (evtNo);
  207.     }
  208.  
  209.     dlg = DLG_msgOpen( x, y, 80*6, 23*12,
  210.         C_MBLACK, C_DLGBASE, COLMIX(C_INFO,C_GRAY), 
  211.         "***** FIND *****" );
  212.     if ( dlg == NULL )
  213.     {
  214.         FDL_close(fdl);
  215.         return (evtNo);
  216.     }
  217.     DLG_msgSetConfig( dlg, 8, 6, 12 );
  218.     DLG_msgClear( dlg, C_HWHITE );
  219.  
  220.     i = ret = 0;
  221.     while ( (fn = FDL_getMarkFile(fdl, i)) != NULL )
  222.     {
  223.         if ( find( dlg, fn ) > 0 )
  224.             ret = 1;
  225.         ++i;
  226.     }
  227.     DLG_msgClose(dlg);
  228.     FDL_close(fdl);
  229.  
  230.     if ( ret )
  231.     {
  232.         dlg = DLG_txtOpen( x, y, TXT_XS, TXT_YS, TxtPtr, 0 );
  233.         if ( dlg == NULL )
  234.             return (evtNo);
  235.         DLG_txtSetTitle( dlg, "FIND" );
  236.         DLG_txtStart( dlg );
  237.         DLG_txtClose( dlg );
  238.     } else
  239.     {
  240.         MNU_sure( x, y, C_MBLACK, C_DLGBASE, COLMIX(C_ERROR,C_GRAY),
  241.             SELBTN_ATT_CENTER, "    Pattern not found!!    " );
  242.     }
  243.  
  244.     return (evtNo);
  245. }
  246.  
  247.  
  248.  
  249. /*************************************************************************
  250. *    メニュー設定
  251. *************************************************************************/
  252.  
  253. int        set_menudat( char *obj )
  254. {
  255.     char    *s;
  256.  
  257.     s = Upcase ? "Upcase [ON]" : "Upcase [OFF]";
  258.     MNU_setObj(obj, 0, MNU_NOR, 'U', s               , NULL, 1, "upcase_func" , NULL );
  259.     MNU_setObj(obj, 1, MNU_NOR, 'P', "Input pattern ", NULL, 2, "pattern_func", NULL );
  260.     MNU_setObj(obj, 2, MNU_BLK,  0 , NULL            , NULL, 0, NULL          , NULL );
  261.     MNU_setObj(obj, 3, MNU_NOR, 'F', "Find"          , NULL, 3, "find_func"   , NULL );
  262. }
  263.  
  264. /*************************************************************************
  265. *    検索のためのメニュー
  266. *************************************************************************/
  267.  
  268. int        find_menu()
  269. {
  270.     int        ret, x, y;
  271.     char    *mnu;
  272.     char    *obj;
  273.  
  274.     if ( (obj = MNU_alloc(4)) == NULL )
  275.         return (ERR);
  276.  
  277.     set_menudat(obj);
  278.     x = y = DLGPOS_CENTER_OF_SCN;
  279.     mnu = MNU_open( x, y, MNUATT_EXIT, obj, "FIND MENU" );
  280.     if ( mnu == NULL )
  281.         return (ERR);
  282.  
  283.     for(;;)
  284.     {
  285.         if ( (ret = MNU_start( mnu )) < 0 )
  286.             break;
  287.         set_menudat(obj);
  288.     }
  289.  
  290.     MNU_close(mnu);
  291.     MNU_free(obj);
  292.  
  293.     return (NORMAL);
  294. }
  295.  
  296. /*************************************************************************
  297. *    MAIN
  298. *************************************************************************/
  299.  
  300. int        main( int argc, char **argv )
  301. {
  302.     init();
  303.  
  304.     find_menu();
  305.  
  306.     term();
  307.     return (0);
  308. }
  309.